template <class t> Pila <t> :: Pila()
{
    return;
}


template <class t> Pila <t> :: ~Pila()
{
    return;
}


template <class t> void Pila <t> :: creaPila()
{
    this -> first = 0;
    this -> nr_nodi = 0;
}


template <class t> bool Pila <t> :: isPilaVuota() //se i nodi sono 0 la pila è vuota e restituisce TRUE
{
    if(nr_nodi == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}


template <class t> t Pila <t> :: leggiPila() throw (errore)
{
    if(nr_nodi == 0)
    {

        throw errore("Si è tentato di leggere da una pila vuota");
    }
    else
    {
        return this -> first -> getElem();
    }

}


template <class t> void Pila <t> :: Push (t elem)
{
    Nodo <t>* new_node = new Nodo <t> () ;
    new_node -> setNext(this -> first);
    first = new_node;
    new_node -> setElem(elem);
    nr_nodi++;
    return;
}



template <class t> void  Pila <t> :: Pop() throw (errore)
{
    if(nr_nodi > 0)
    {
        Nodo <t>* temp;
        temp = this -> first;

        this -> first = temp -> getNext();

        delete temp;
        nr_nodi--;
        return;
    }
    else
    {

        throw errore("Si è tentato di cancellare un elemento da una pila vuota");
    }

}



template <class t> int Pila<t>::getNumElementi()  throw (errore)
{
    if( Pila <t> :: nr_nodi >= 0)
    {
        return Pila <t> :: nr_nodi;
    }
    else
    {
        throw errore ("Numero di elementi inconsistente. Pila vuota.");
    }
}